/*
 * Item.h
 *
 *  Created on: 2013. 9. 10.
 *      Author: jjaehuny
 */

#ifndef PROJECTZ_NLOGIC_ITEM_H_
#define PROJECTZ_NLOGIC_ITEM_H_

#include <Network/Packet.h>
#include <time.h>
//#include "../NUtil/Pool.h"
#include "../Enum.h"


namespace ProjectZ {
class User;
} /*ProjectZ*/

namespace ProjectZ { namespace NLogic {

class Item
{

public:
	enum class ItemStatus
	{
		EM_ITEM_STATUS_NORMAL = 0,					// 정상

		EM_ITEM_STATUS_REG_MARKET	= 10,			// 거래소 등록
		EM_ITEM_STATUS_DESTROY,						// 아이템 파괴
		EM_ITEM_STATUS_SELL_STORE,					// 상점 판매
		EM_ITEM_STATUS_UPSTONE,						// 강화석 제작
		EM_ITEM_STATUS_SEND_MAIL,					// 메일 첨부 발송
		EM_ITEM_STATUS_FAIRY_REBIRTH,				// 페어리 환생 재료
		EM_ITEM_STATUS_FAIRY_SACRIFICE,				// 페어리 희생
		EM_ITEM_STATUS_BATTLEPET_COMBINE,			// 전투펫 합성
		EM_ITEM_STATUS_BATTLEPET_EVOLUTION,			// 전투펫 궁극 진화
		EM_ITEM_STATUS_ITEM_USE,					// 아이템 사용 (물약, 식별주문서 등)
		EM_ITEM_STATUS_FAIRY_ULTIMATE_EVOLUTION = 20,	// 페어리 궁극진화
		EM_ITEM_STATUS_UPSTONE_COMBINE,				// 강화석 합성
		EM_ITEM_STATUS_MAGIC_REFINE_DESTROY,		// 마법 제련 실패 파괴
		EM_ITEM_STATUS_FAIRY_COMBINE,				// 페어리 합성
		EM_ITEM_STATUS_FAIRY_EVOLUTION,				// 페어리 진화
		EM_ITEM_STATUS_FAIRY_EGG_HATCH,				// 페어리 알 부화

		EM_ITEM_STATUS_INVALID_ITEM	= 99,			// 비정상
	};

public:
	struct Data
	{
		int bag_type;
		int bag_slot_number;	//2	u16	인벤 슬롯 인덱스
		int stack_num;
		int class_type;			//1	char	장착클래스 타입
		int sub_type;			//1	char	서브타입 // sheet number
		int tid;				//2	short	TID
		int item_type;
		int iconidx;

		int cur_duration;		//1	char	내구도 현재
		int max_duration;		//1	char	내구도 최대
		int quantity;			//1	char	스탯된 개수
		int set_type;			//1	char	세트아이템타입(-1 : 없음)
		int non_identity;		//1	char	미식별여부
		int cur_refine_step;	//1	char	현재 제련단계
		int quality;			//2	u8	아이템 등급
		int level;				//2	u8	레벨

		int eff_type[7];		//1	char	기본이펙트 : 효과타입
		int eff_pos[7];			//1	char	기본이펙트 : 위치
		int eff_value[7];		//2	short	기본이펙트 : 효과치

		int open_upgrade_stone_slot;	//1	char	오픈된 강화석 슬롯수
		int ability_enhance_rate;	//1	char	기본능력치 상향
		int max_enhance_step;	//1	char	제련 최대값
		int buy_use;			//1	char	구매 후 바로 사용 여부
		int evolve_step;		//1	char	진화단계
		int evolve_max;			//1	char	진화 최대단계
		int evolve_point;		//2	short	진화포인트
		int evolve_percent;		//1	char	진화이펙트 퍼센트
		int evolve_value;		//2	short	진화이펙트 값

		time_t reg_date;

		Data()
		{
			bag_type = 0;
			bag_slot_number = 0;	//2	u16	인벤 슬롯 인덱스
			stack_num = 0;
			class_type = 0;			//1	char	장착클래스 타입
			sub_type = 0;			//1	char	서브타입 // sheet number
			tid = 0;				//2	short	TID
			item_type = 0;
			iconidx = 0;

			cur_duration = 0;		//1	char	내구도 현재
			max_duration = 0;		//1	char	내구도 최대
			quantity = 0;			//1	char	스탯된 개수
			set_type = 0;			//1	char	세트아이템타입(-1 : 없음)
			non_identity = 0;		//1	char	미식별여부
			cur_refine_step = 0;	//1	char	현재 제련단계
			quality = 0;			//2	u8	아이템 등급
			level = 0;				//2	u8	레벨

			set_type = -1;

			for (int i = 0; i < 7; i++)
			{
				eff_type[i]		= -1;
				eff_pos[i]		= -1;
				eff_value[i]	= -1;
			}

			open_upgrade_stone_slot = 0;	//1	char	오픈된 강화석 슬롯수
			ability_enhance_rate = 0;	//1	char	기본능력치 상향
			max_enhance_step = 0;	//1	char	제련 최대값
			buy_use = 0;			//1	char	구매 후 바로 사용 여부
			evolve_step = 0;		//1	char	진화단계
			evolve_max = 0;			//1	char	진화 최대단계
			evolve_point = 0;		//2	short	진화포인트
			evolve_percent = 0;		//1	char	진화이펙트 퍼센트
			evolve_value = 0;		//2	short	진화이펙트 값

			time(&reg_date);
		}

		void Clear()
		{
			bag_type = 0;
			bag_slot_number = 0;	//2	u16	인벤 슬롯 인덱스
			stack_num = 0;
			class_type = 0;			//1	char	장착클래스 타입
			sub_type = 0;			//1	char	서브타입 // sheet number
			tid = 0;				//2	short	TID
			item_type = 0;
			iconidx = 0;

			cur_duration = 0;		//1	char	내구도 현재
			max_duration = 0;		//1	char	내구도 최대
			quantity = 0;			//1	char	스탯된 개수
			set_type = 0;			//1	char	세트아이템타입(-1 : 없음)
			non_identity = 0;		//1	char	미식별여부
			cur_refine_step = 0;	//1	char	현재 제련단계
			quality = 0;			//2	u8	아이템 등급
			level = 0;				//2	u8	레벨

			set_type = -1;

			for (int i = 0; i < 7; i++)
			{
				eff_type[i]		= -1;
				eff_pos[i]		= -1;
				eff_value[i]	= -1;
			}

			open_upgrade_stone_slot = 0;	//1	char	오픈된 강화석 슬롯수
			ability_enhance_rate = 0;	//1	char	기본능력치 상향
			max_enhance_step = 0;	//1	char	제련 최대값
			buy_use = 0;			//1	char	구매 후 바로 사용 여부
			evolve_step = 0;		//1	char	진화단계
			evolve_max = 0;			//1	char	진화 최대단계
			evolve_point = 0;		//2	short	진화포인트
			evolve_percent = 0;		//1	char	진화이펙트 퍼센트
			evolve_value = 0;		//2	short	진화이펙트 값

			time(&reg_date);
		}

	};

public:
	Item();
	virtual ~Item();

	void 			Initialize();
	void 			Finalize();

	Data &			GetData();
	bool 			Open_Normal(const Data & data, User * pUser);
	void 			Open_Fairy(const Data & data, User * pUser);
	void 			Open_FromDatabase(uint64_t itemSeq, const Data & data, User * pUser);
	void 			Open_None(const Data & data, User * pUser);
	void			Open_UpStone(const Data & data, User * pUser);
	void			Open_DungeonDrop(const Data & data, User * pUser);

	uint64_t		GetItemSeq();

	void 			SetEquip(EnumItemEquipPosition eEquipPos);
	EnumItemEquipPosition	GetEquipPos();
	bool			IsEquip();

//	void			SetQuickSlot(int quickSlotIndex) { _quickSlotIndex = quickSlotIndex; }
//	bool			IsQuickSlot();

	bool			InsertToDatabaseItemInfo(int slotIndex = -1);
	bool 			UpdateDatabaseItemInfo();
	bool			DeleteDatabaseItemInfo(ItemStatus eStatus);

	void 			WriteToPacket(::Network::Packet *packet);

	void 			SetStatus(int status);
	int				GetStaus();


	// warehouse -> to bag
	void 			ChangeBagTypeFromResourceData();

	// bag -> warehouse
	void 			ChangeBagTypeWareHouse();

	// 던전 보상 및 아이템 뽑기의 경우 무조건 식별아이템이다.
	void			ChangeIdentifyItem();
	void			DecreaseBattlepetStamina();

private:
	Data 			_data;
	uint64_t 		_itemSeq;
	User *			_user;
	int 			_status;
//	int 			_quickSlotIndex;

	EnumItemEquipPosition e_EquipPos;
};

} /*NLogic*/ } /* namespace ProjectZ */

#endif /* ITEM_H_ */
